package org.devocean.groupbuying.dao.impl;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.devocean.groupbuying.dao.PurchaseItemDAO;
import org.devocean.groupbuying.domain.PurchaseItem;
import org.springframework.stereotype.Repository;

@Repository
public class PurchaseItemDAOImpl implements PurchaseItemDAO {

	@PersistenceContext
	private EntityManager em;

	public List<PurchaseItem> findAllPurchasesItems() {
		return em.createQuery("select pu from PurchaseItem pu").getResultList();
	}

	public long countPurchaseItems() {
		return em.createQuery("select count(pu) from Purchaseitem pu",
				long.class).getSingleResult();
	}

	public PurchaseItem findPurchaseItemById(Integer id) {
		return em.find(PurchaseItem.class, id);
	}

	public void deletePurchaseItem(int id) {
		final PurchaseItem purchaseitem = em.find(PurchaseItem.class, id);
		if (purchaseitem != null) {
			em.remove(purchaseitem);
		}

	}

	public PurchaseItem savePurchaseItem(PurchaseItem purchaseitem) {
		em.persist(purchaseitem);
		return purchaseitem;
	}

	public PurchaseItem updatePurchaseItem(PurchaseItem purchaseitem) {
		em.merge(purchaseitem);
		em.flush();
		return purchaseitem;
	}

	public long countPurchaseItemsByCustomerAndDeal(Integer customerID,
			Integer dealID) {
		final Query query = em.createQuery(
				"SELECT count(pu) FROM PurchaseItem pu "
						+ "INNER JOIN pu.purchase p "
						+ "INNER JOIN p.customer c "
						+ "INNER JOIN pu.discount di "
						+ "INNER JOIN di.deal d "
						+ "WHERE c.customerID=:cid AND d.dealID=:did",
				Long.class);
		query.setParameter("cid", customerID);
		query.setParameter("did", dealID);
		return (Long) query.getSingleResult();
	}

}
